package com.example.simpleweb.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.simpleweb.entity.User;
import com.example.simpleweb.mapper.UserMapper;
import com.example.simpleweb.service.UserService;
import com.github.javafaker.Faker;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Locale;

/**
 * @Classname: UserServiceImpl
 * @Description: TODO
 * @Date: 2024/9/6 17:46
 * @author: hbr
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    @Transactional
    public User randomAddUser() {
        User user = User.builder()
                .name(generateName("zh_cn"))
                .age(generateAge())
                .email(generateEmail("en"))
                .build();
        save(user);
        return user;
    }


    /**
     * 根据指定的语言生成一个随机姓名
     * 如果语言参数为空或未提供，则默认使用英语
     *
     * @param language 期望使用的语言代码，例如"en"代表英语，"zh"代表中文
     * @return 生成的随机姓名
     */
    private String generateName(String language){
        // 如果语言参数为空或只有空白字符，则默认使用英语
        if (StringUtils.isBlank(language)){
            language = "en";
        }
        // 创建一个Faker对象，使用提供的语言代码初始化
        Faker faker = new Faker(new Locale(language));
        // 使用Faker对象生成一个随机姓名并返回
        return faker.name().fullName();
    }


    /**
     * 根据指定的语言生成一个随机的电子邮件地址
     * 如果提供的语言为空或无效，则默认使用英语("en")
     * 此方法使用Faker库来生成电子邮件地址，以确保生成的数据与指定的语言环境相匹配
     *
     * @param language 用于生成电子邮件地址的语言环境如果为空，将使用默认值"en"
     * @return 随机生成的电子邮件地址
     */
    private String generateEmail(String language){
        // 如果语言参数为空，则默认设置为英语语言环境代码"en"
        if (StringUtils.isBlank(language)){
            language = "en";
        }
        // 创建指定语言环境的Faker实例
        Faker faker = new Faker(new Locale(language));
        // 使用Faker实例生成并返回一个随机的电子邮件地址
        return faker.internet().emailAddress();
    }


    /**
     * 随机生成年龄
     *
     * 该方法用于生成一个0到100之间的随机年龄值主要目的是为了模拟
     * 一个简化的场景，比如生成测试数据或在游戏中创建角色的随机年龄
     * 使用Math.random()方法乘以100来生成一个随机数，然后将其转换为整数，
     * 以代表一个可能的年龄值这种方法简单且有效，但需要注意的是，
     * 由于使用了Math.random()，所生成的年龄是均匀分布的，这可能不完全符合
     * 现实世界中年龄分布的情况
     *
     * @return 生成的随机年龄值，范围在0到100之间
     */
    private int generateAge(){
        return (int) (Math.random() * 100);
    }
}
